package com.vgulu.server.common.BaseDao;

import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * Created by wangchunsee on 16/1/12.
 */
public interface BaseDao<K,T> {
    /**
     * 通过Id查询一个对象，如果id为null这会抛出IllegalArgumentException异常
     * @param id 主键，不能为null
     * @return  结果对象，如果未找到返回null
     */
    public <V extends T> V selectByPrimaryKey(K id);


    /**
     *<pre>查询对象列表，注意：在给定非null的分页对象时该方法自动设置分页总记录数,如果query和pageable同时为null则查询所有</pre>
     * @param query 查询参数
     * @param pageable 分页对象
     * @return List 根据分页对象查询的分页结果列表
     */
    public <V extends T> List<V> selectList(T query, Pageable pageable);

    public <V extends T> List<V> selectList(T query, Pageable pageable, String selectId);

    public <V extends T> List<V> selectList(Map query, Pageable pageable, String selectId);

    public <V extends T> V selectOne(T query);

    public <V extends T> V selectOne(Map query, String selectId);

    public <V extends T> V selectOne(T query, String selectId);
    /**
     * 查询记录数
     * @param query 查询对象，如果为null，则查询对象总数
     * @return long 记录总数
     */
    public int selectCount(T query);

    /**
     * 添加对象
     * @param entity 要实例化的实体，不能为null
     * @return 受影响的结果数
     * @date 2014年3月3日下午5:47:15
     */
    public int insert(T entity);

    /**
     * 更新对象
     * @param entity 实体的Id不能为null
     * @return int 受影响结果数
     * @date 2014年3月3日下午5:48:05
     */
    public int updateByPrimaryKey(T entity);

    public int insertSelective(T entity);

    public int updateByPrimaryKeySelective(T entity);

    public int batchInsert(List<T> list);

    public int batchUpdate(List<T> list);

    public int deleteByPrimaryKey(K id);

    public int update(T entity, String selectId);

    public List<Map<String,Object>> selectMap(Map query, Pageable pageable, String selectId);

    public Map<String,Object> selectOneMap(Map query, String selectId);

    public List<Map<String,Object>> selectMap(T query, Pageable pageable, String selectId);

    public Map<String,Object> selectOneMap(T query, String selectId);

    public <V extends T> List<V> select(Map query, String selectId);

    public int selectCount(Map query, String selectId);

    public List<Map<String,Object>> selectMap(Map query, String selectId);
}
